1/2015-Python-Último Grupo
Integrantes do grupo Bruno Monteiro - 09/90949 Élida Borges - 12/0067307 Gabriel Ferreira - 14/0140131 Luan Cardoso - 12/0036061 Lucas Avelino - 13/0013072 Slides Os slides podem ser vistos acessando este link Histórico e Versões da linguagem Histórico ' Python foi concebido no fim da década de 80 (sua implementação começa em 1989), por Guido Van Rossum, quando este trabalhava no CWI (Instituto Nacional de Pesquisa em Matemática e Ciência da Computação), na Holanda. A intenção era ter uma linguagem capaz de suceder a linguagem de programação ABC, que fosse capaz de ter tratamento de exceções e de interfaciar com o sistema operacional Amoeba. 'Versão 0.9 Em fevereiro de 1991, Van Rossum publicou o código da primeira versão de Python, que ficou conhecida como versão 0.9.0. O sistema que permitia a programação modular foi baseado na linguagem de programação Modula-3. Tal versão já possuia classes com herança, tratamento de exceções, funções e os tipos de dados primitivos da linguagem de Python atual (listas, tuplas, dicionários...). 'Versões 1.x' A versão 1.0 de Python foi lançada em janeiro de 1994. O principais ganho foi a expansão da capacidade de programar de modo funcional, com a inclusão de funções lambda e das funções map, filter e reduce. A versão 1.2 foi a última lançada enquanto Van Rossum esteve no CWI, já que em 1995 ele foi para o CNRI(Corporação para Iniciativas de Pesquisa Nacional), nos Estados Unidos. Em sua versão 1.4, Python adquiriu novas funcionalidades. Suporte para o tratamento de números complexos foi introduzido, assim como uma melhora na forma de encapsular dados, baseado no Modula-3. A versão 1.6 foi lançada em 2000, pela CNRI mas pouco tempo depois a versão 2.0 é lançada por uma equipe de programadores que haviam ido fundar a BeOpen.com, da qual Van Rossum fazia parte. A versão 1.6.1 surge em 2001, tendo características semelhantes a versão 2.1. 'Versões 2.x' Em 2000, houve a migração de boa parte da equipe de desenvolvimento de Python para o BeOpen.com. A BeOpen.com lança então a versão 2.0 da linguagem, também em 2000. Essa versão introduz, baseado-se nas linguagens de programação funcional SETL e Haskell, a possibilidade de construir listas a partir de listas já existentes. Outra inovação foi um sistema coletor de lixo. A versão 2.1 surge em 2001, e desde então as distribuições de Python passam a ser da PSF (Python Software Foundation) e compatíveis com o padrão GPL. A versão 2.2 surge em 2001, e agrupava em uma mesma hierarquia os tipos de Python (escritos em C) e as classes (escritas em Python). A versão 2.6. surge em 2008, tendo como objetivo preparar uma transição para a versão 3.0, sem entretanto perder compatibilidade com códigos Python escritos em versões antigas. A versão 2.7 foi a última da série 2.x, tendo sido lançada em 2010. Os projetistas e mantenedores da linguagem Python decidiram não adicionar mais nenhuma funcionalidade às versões 2.x, embora tenham anunciado que irão continuar corrigindo as versões de possíveis bugs e atualizando-as para mantê-las compatíveis com novas tecnologias de hardware e de sistemas operacionais que venham a ser lançadas. 'Versões 3.x' A decisão de criar uma nova versão da linguagem, visou reduzir o número de maneiras diferentes de se fazer uma determinada ação em Python. Assim sendo, houve uma reestruturação da linguagem, a qual teve como consequência a perda de compatibilidade com a série 2.x. A primeira versão, a 3.0, surgiu em 2008. A versão mais atual é a 3.4 As versões 3.x apresentam mudanças consideráveis. O comando print foi substituido pela função print(). Há um melhor suporte Unicode, já que todas as strings são unicode por padrão. Pequenas mudanças na sintaxe também ocorreram. Apesar das mudanças, muitos pacotes já estão disponíveis em Python 3, como o Numpy, o Django e o Flask. 'Evolução da linguagem' A tabela abaixo mostra a evolução da linguagem: Projeto 'Premissas' Desejava-se uma linguagem que fosse capaz de interfaciar com o sistema operacional Amoeba, expansível e com tratamento de exceções e orientação a objetos. 'Usuário Característico' Python não exige que seu usuário característico seja um programador experiente ou que tenha experiência em outras linguagens de programação. Um conhecimento mínimo de programação é suficiente para se programar em Python. 'Domínio' Python é uma linguagem de alto nível de propósito geral, podendo ser aplicada a diferentes tipos de problemas como processamento de textos, desenvolvimento Web, realização de integração entre diferentes aplicações... Construtores 'Tipos' Python tem vários tipos primitivos de dados, dos quais os principais são int, float, string, listas, tuplas e dicionários. Diferentemente do C, Python tem verificação de tipos em tempo de execução, não sendo portanto necessário declarar o tipo de uma variável no código fonte. Os tipos int e float representam inteiros e números reais respectivamente, e são semelhantes ao C. As strings em Python são cadeias de caracteres, e são imutáveis. Há muitos métodos para se manusear strings em Python, conforme a figura: As listas são muito usadas em Python, até porque Python não dispões de uma estrutura de dados para arrays (embora tal estrutura esteja presente em pacotes como o Numpy). Podem ser heterogêneas e são tipos mutáveis. Há muitos métodos para listas em python, conforme a figura: Tuplas são parecidas com as listas, sendo delimitadas por colchetes. A principal diferença está no fato de tuplas serem imutáveis. Segue exemplo: Dicionários são uma das estruturas mais poderosas de Python, sendo também conhecidos como arrays associativos em Python. Trata-se de uma estrutura que guarda pares da forma chave:valor. O dicionário permite inserir, deletar e procurar com uma complexidade média de O(1). Os métodos para se manipular dicionários são mostrados abaixo: 'Operadores' Python possui operadores relacionais, lógicos e aritméticos. Os operadores relacionais são semelhantes a C: Os operadores lógicos funcionam de maneira semelhante a C, porém tem sintaxe diferente: Os operadores aritméticos funcionam de modo semelhante a C, a única diferença é o operador "/" fazer a divisão e converter para float e o operador "//" fazer a divisão e dar o resultado em inteiro: 'Comandos' Python tem comandos condicionais e comandos de iteração. Os principais comandos condicionais de Python são o if, o elif e o else. O exemplo abaixo ilustra seu uso: Os principais comandos de iteração são o while e o "for". O "for" pode ser usado para iterar por uma sequência. Segue exemplo: 'Funções' As funções em Python são declaradas pela palavra reservada "def", seguido do nome da função, seguido dos argumentos que a função recebe. Por Python ter verificação dinâmica, não é necessário declarar os tipos de retorno da função ou os tipos de argumentos. Há a possibilidade de argumentos opcionais, que assumem um valor default caso não sejam passados na chamada da função. Segue exemplo: O resultado no terminal é mostrado abaixo: Há a possibilidade de funções lambda: Python disponibiliza algumas funções sem a necessidade de incluir módulos: 'Classes' Python permite ao usuário definir novos tipos de dados, através das classes: 'Tratamento de Exceções' Python permite tratamento de exceções, através das palavras reservadas try, except e finally. 'Palavras Reservadas' Python possui as seguintes palavras reservadas: * A palavra reservada "and" é equivalente ao && do C. * A palavra reservada "as" serve para dar nome diferente a modulos (Ex: import matplotlib as plt). * A palavra reservada "assert" lança um erro de assertiva caso a expressão passada retorne falso (Ex: assert(2 > 5)). * A palavra reservada "break" funciona como em C. * A palavra reservada "class" define uma classe. * A palavra reservada "continue" funciona como em C. * A palavra reservada "def" é usada na hora de definir funções. * A palavra reservada "del" é usada para deletar uma referência a um objeto (Ex: del x). * A palavra reservada "elif" é equivalente ao else if do C. * A palavra reservada "else" é igual ao C. * A palavra reservada "exec" é usado para executar um programa ou comando dinamicamente criado. * A palavra reservada "except" é utilizada no tratamento de exceções. * A palavra reservada "finally" é utilizada para tratamento de exceções. * A palavra reservada "for" é usada para iterar por uma sequência. * A palavra reservada "from" é usada na hora de importar um módulo (Ex: from urllib import request). * A palavra reservada "global" é usada para modificar variáveis globais em contexto local. * A palavra reservada "if" funciona como em C. * A palavra reservada "import" é usada para importar um módulo (Ex: import urllib). * A palavra reservada "in" serve para testar se uma sequência contém um valor específico (Ex: for 4 in pares:...). * A palavra reservada "is" serve para comparar a identidade de objetos, diferenciando-se assim de " " que compara valores. * A palavra reservada "lambda" serve para definir funções lambda. * A palavra reservada "not" funciona como o ! no C. * A palavra reservada "or" funciona como o || em C. * A palavra reservada "pass" não faz nada, podendo ser utilizado quando um comando é requerido sintaticamente. * A palavra reservada "print" imprime na tela. Nas versões 3.x, print passou a ser a função print(). * A palavra reservada "raise" é utilizada no tratamento de exceções. * A palavra reservada "return" funciona como em C. * A palavra reservada "try" é utilizada no tratamento de exceções. * A palavra reservada "while" funciona como em C. * A palavra reservada "with" simplifica tratamento de exceções (Ex: with open('/tmp/workfile', 'r') as f:...). * A palavra reservada "yield" funciona como um "return", com a exceção de que a função irá retornar um gerador (gera valores em tempo de execução). (Ex: for num in list1: yield num*num). Paradigmas da Linguagem Python é uma linguagem multiparadigma, suportando os paradigmas imperativo/procedural, funcional e orientado a objetos. Um exemplo do paradigma procedural segue: Um exemplo do paradigma funcional segue: Um exemplo do paradigma orientado a objetos segue: Avaliação da Linguagem 'Legibilidade' Python tem poucos componentes básicos (são pouco mais de 30 palavras reservadas, contra mais de 50 da linguagem Java). Há sobrecarga de operadores, porém de maneira bem feita (o operador + pode ser usado para concatenar duas strings, por exemplo). A multiplicidade de recursos, que era um problema na série 2.x foi corrigida nas versões 3.x. Assim, Python apresenta uma ótima simplicidade global. Python tem ótima ortogonalidade, já que é fácil combinar blocos básicos, independentemente do contexto. Há instruções de controle em Python, como o uso do "break" por exemplo, o que pode diminuir um pouco a legibilidade quando mal usado. Os tipos de dados primitivos de Python são úteis em uma variedade de situações, e é fácil definir novos tipos. Python é uma linguagem multiparadigma, e a utilização de vários paradigmas em um mesmo programa também pode diminuir a legibilidade. Por fim, Python tem uma sintaxe clara, uma semântica intuitiva e um código em geral pouco carregado, o que torna a linguagem legível. 'Capacidade de escrita' Python tem simplicidade global e ortogonalidade boa. É fácil definir novas funções ou novas classes, o que torna Python uma linguagem com um bom suporte para abstração. Seus tipos primitivos possuem operações úteis e permitem trabalhar em muitos contextos, o que torna Python uma linguagem com boa expressividade. Sua sintaxe é clara, com operações em alto nível. A desvantagem está na pouca expressividade para comandos mais próximos ao hardware. Apesar disso, a capacidade de escrita de Python é ótima. 'Confiabilidade' Python tem tratamento de exceções nativo e uma boa legibilidade e capacidade de escrita. Apesar disso, a linguagem também possui verificação de tipos dinâmica (alguns erros que outras linguagens descobrem em tempo de compilação só são descobertos pela linguagem durante a execução do programa) e a possibilidade de "alias". 'Custo' Python tem custo de treinamento baixo, já que é uma linguagem com baixa curva de aprendizagem, boa legibilidade e capacidade de escrita. O custo para escrever programas também é baixo, já que Python possui alta capacidade de escrita, e vários domínios de aplicação. O custo da manutenção do programa também é baixo, devido a alta legibilidade dos códigos escritos em Python. Por fim, o custo para a execução do programa é alto, i.e, a velocidade de execução não é tão alta. 'Outros' Portabilidade * Python pode ser executado nos sitemas operacionais Windows, Mac, Solaris, Linux entre outros. Além disso, sua comunidade garantiu que a série 2.x continuaria sendo atualizada para que funcione em atualizações de sistemas operacionais. Assim sendo, Python possui boa portabilidade. Generalidade * Python tem aplicações em diferentes domínios. É utilizada para ensino, por ser uma linguagem com curva de aprendizagem baixa. Pode ser usada para desenvolvimento Web, com os frameworks Django e Flask. Pode ser usada no domínio científico, com os pacotes Numpy e Astropy. Assim, conclui-se que Python tem boa generalidade. Qualidade de Definição * Python tem gramática bem definida e, portanto, boa qualidade de definição. 'Resumo' Legibilidade: Bom Capacidade de Escrita: Ótima Confiabilidade: Média Custo: Bom Outros: Ótimo Justificativas para uso da linguagem Escolheu-se usar Python devido a sua sintaxe simples, ao seu suporte à Orientação a Objetos e a grande disponibilidade de frameworks, o que nos permitiu desenvolver rapidamente nossa aplicação Web. Grandes empresas como o Google, a Yahoo e o Youtube utilizam Python em aplicações Web. Especificidades O projeto implementado utilizou várias bibliotecas, frameworks e outras especificidades da linguagem. São eles: 1. Flask 2. Thread 3. URRLib - para manipular a URL que será enviada ao usuário. 4. SQLite 5. Dataset 6. MD5 - para criação da Hash. 7. Time - obter a data atual para criação de Hash. Projeto O projeto consiste em um site que permite ao presidente de um grupo de jogadores de futebol marcar partidas de futebol, especificando data, horário e local. Cada um dos jogadores do grupo recebe então um SMS com o link para um site onde é possível confirmar presença ou ausência na partida marcada, assim como ver quem já confirmou ou irá faltar. Assim, o sistema auxilia na organização eficiente de jogos de futebol entre amigos. Instalação Codificou-se o projeto o qual se encontra disponível para utilização, bastando seguir as etapas abaixo: sudo apt-get update sudo apt-get install python python-virtualenv mkdir lp cd lp touch __init__.py touch app.py virtualenv ambiente source ambiente/bin/activate pip install flask ipython dataset plivo Banco de dados SQLite As queries para se criar tabelas no banco de dados são: CREATE TABLE "tb_coordenador" ( `int_idCoordenador` INTEGER PRIMARY KEY AUTOINCREMENT, `str_nomeCoordenador` TEXT, `str_login` TEXT, `str_senha` TEXT, `str_loginCoordenador` TEXT, `str_senhaCoordenador` TEXT ) CREATE TABLE "tb_jogador" ( `int_idCoordenador`INTEGER, `int_idJogador`INTEGER PRIMARY KEY AUTOINCREMENT, `str_nomeJogador`TEXT, `str_emailJogador`TEXT, `str_hashJogador`TEXT, `str_telefoneJogador`TEXT, FOREIGN KEY(`int_idCoordenador`) REFERENCES tb_coordenador ( int_idCoordenador ) ) CREATE TABLE "tb_partida" ( `int_idPartida`INTEGER PRIMARY KEY AUTOINCREMENT, `int_idCoordenador` INTEGER, `str_localPartida`TEXT, `dt_dataPartida`TEXT, `str_hashPartida`TEXT, FOREIGN KEY(`int_idCoordenador`) REFERENCES tb_coordenador ( int_idCoordenador ) ) CREATE TABLE "tb_confirmado" ( `int_idPartida` INTEGER, `int_idJogador` INTEGER, PRIMARY KEY(int_idPartida,int_idJogador), FOREIGN KEY(`int_idPartida`) REFERENCES tb_partida ( int_idPartida ), FOREIGN KEY(`int_idJogador`) REFERENCES tb_jogador ( int_idJogador ) ) O projeto utilizou a versão 2.7 do Python e funciona para versões Ubuntu acima de 12.4 e Debian acima de 6.0 Código Fonte O código fonte está disponível e pode ser baixado aqui. Referências *As wiki's dos grupos 1, 2 e 3 foram observadas na hora de montar a estrutura desta.